#※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
# File Name: html.sh
# Author: GID5564
# Description:
# Created Time: 03/07/22-15:54:43
#※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
#! /usr/bin/bash
# 避免重复导入
#[[ -n $__XLIB_IMPORTED__WEB ]] && return 0
#__XLIB_IMPORTED__WEB=1

function __web_init__(){
    wait
}

########################################
#功能: 在终端打开网页，如果为gun/linux系统，则先测试安装firefox-esr，并设其为默认浏览器
#参数: $1，网页地址
#返回
########################################
function open_web_to_terminal(){
    #在终端打开网页
    local url=$1
    if [[ -z ${url} ]];then
        error "Usage: open_web_to_terminal <url>"
        return $INVALID_ARGUMENTS
    fi
    
    local isl=$(IsLink ${url})
    if [[ ${isl} -ne 1 ]];then
        error "无效网址: ${url} "
        return $INVALID_ARGUMENTS
    fi
    case ${OSTYPE} in
    "darwin")
        # macOS
        open ${url}   
        ;;
    "linux-gnu")
        # Linux
        apt_install "firefox-esr"
        #usr/share/applications/
        xdg-settings set default-web-browser firefox-esr.desktop
        xdg-open ${url} 
        ;;
    *)
        error "${BLUE}不支持系统类型: ${RESET}${RED}${OSTYPE}${RESET}"  
        return 1
        ;;
    esac
    unset url isl
}
########################################
# 描述: 下载网络上的文件
# 参数: $1:文件路径，首行无"/"，文件内容如:
#   quickstart/img/install-Linux1.png  
#   quickstart/img/install-Linux2.jpg  
#   quickstart/img/install-Linux3.jpg  
#   quickstart/img/install-Linux4.png  
#       $2:网址，最后一个字符不是"/"
#       $3:指定目录,默认当前目录下"download/"
# 返回:
# 实例: download_file  dd.txt "/home/aidlux" "https://docs.aidlux.com"
########################################
function get_web_files(){
    if [[ -z ${2} ]] || [[ -z ${1} ]];then
        error "Usage: get_web_files <路径文件> <网址> [保存目录]"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "Usage: ${1} 无效文件!"
        return $INVALID_ARGUMENTS
    }

    local isl=$(IsLink ${2})
    if [[ ${isl} -ne 1 ]];then
        error "Usage: ${2} 地址格式不合理!"
        return $INVALID_ARGUMENTS
    fi
    local path_file=${1}
    local url=$(add_spec ${2})
    local m_dir=${3}
    if [[ -z ${m_dir} ]];then
        m_dir=$(pwd)
    fi
    m_dir=${m_dir}"/download"
    [[ ! -d ${m_dir} ]] && {
        mkdir -p $m_dir
    }

    while read line ;
    do
        local addr=$(echo $line | sed "s/^/\//g" | sed "s/^/$url/g")
        eval "wget ${addr} -P ${m_dir}"
        unset addr
    done < ${path_file}
    unset path_file url m_dir isl
}

########################################
# 描述: 从给定的网址下载网页文档，并根据指定的下载层级进行递归下载。如果没有指定下载层级，则下载整个网站。如果没有指定保存目录，则将文件保存在当前目录下的"download"文件夹中
# 参数: $1:文档网址 $2:下载层级 $3:保存目录
# 返回: get_web_document 'https://aidlux.com/pip' "all"
#       get_web_document 'https://aidlux.com/pip' "5"
########################################
function get_web_document(){
    [[ -z ${1} ]] && {
        error "Usage: get_web_document <文档网址> <下载层级> [保存目录]"
        return $INVALID_ARGUMENTS
    }
    local url=$1
    local level=${2:-5}
    local m_dir="${3:-$(pwd)/download}"
    [[ ! -d ${m_dir} ]] && {
        mkdir -p $m_dir
    }

    local isl=$(IsLink ${url})
    if [[ ${isl} -ne 1 ]];then
        error "Usage: ${url} 无效地址!"
        return $INVALID_ARGUMENTS
    fi

    local isn=$(IsNumber ${level})
    if [[ ${isn} -ne 1 ]];then
        level="all"
    fi

    [[ ${level} == "all" ]] && {
        eval "wget --mirror --convert-links --adjust-extension --page-requisites --no-parent -p ${url} -P ${m_dir}"
    } || {
	    eval "wget -e robots=off -c -r -np -k -L -P ${m_dir} -p ${url}"
	}
	#
	#-e robots=off,让wget耍流氓无视robots.txt协议
	#-c,继续下载已经下载了一部分的文件
	#-r ,递归下载
	#-np,不追溯至父目录
	#-k,将绝对连接转换为相对链接,即让下载得到的 HTML 或 CSS 中的链接指向本地文件
	#-L, --relative 只跟踪有关系的链接。
	#-l –level=5 ,下载层次,最大递归深度，0表示无限
	#-p 目录 ,保存文件前先创建指定名称的目录
	#-A ,下载指定格式文件
	unset level url m_dir isl isn
}

########################################
#功能: 获取HTML网页Title
#参数: $1，HTML文件路径
#返回: 标题字符串
########################################
function get_html_title(){
    [[ -z ${1} ]] && {
        error "Usage: get_html_title <HTML文件>"
        return $INVALID_ARGUMENTS
    }
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }

    local title=$(cat ${1} | grep -o -e '<title>.*</title>' | sed -r 's/<\/?title>//g')
    echo ${title}
    unset title
}



########################################
#功能: 从HTML提取指定标签中的内容
#参数: $1，HTML文件路径
#返回: 标签内容
#示例: get_html_tags "tt.htm" "img"
########################################
#<img src="https://tools.kalvinbg.cn/static/image/icon/char.png" alt="tool icon">
function get_html_tags(){
    if [[ -z ${1} ]] || [[ -z ${2} ]];
    then
        error "Usage: get_html_tags <HTML文件> <标签>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local htm=$1
    local tag=$2
    local regu="<${tag}[^>]*>"
    local tags=$(grep -oP "${regu}" ${htm})
    echo ${tags}
    unset htm tag regu tags
}


########################################
#功能: 从HTML提取指定的双标签
#参数: $1，HTML文件路径
#返回: 标签内容
#示例: get_html_double_tags "tt.htm" "img"
########################################
#<a href="https://tools.kalvinbg.cn/txt/ascii" class="kt-text-decoration" target="_blank">马上使用</a>
function get_html_double_tags(){
    if [[ -z ${1} ]] || [[ -z ${2} ]];
    then
        error "Usage: get_html_double_tags <HTML文件> <标签>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local htm=$1
    local tag=$2
    local regu="<${tag}[^>]*>.*?(<\/${tag}>)"
    local tags=$(grep -oP "${regu}" ${htm})
    echo ${tags}
    unset htm regu tag tags
}

########################################
#功能: 从HTML提取指定的单标签
#参数: $1，HTML文件路径
#返回: 标签内容
#示例: get_html_single_tags "tt.htm" "meta"
########################################
#<meta name="msvalidate.01" content="601BD2B6EA268E4B6155C7E954A36EF5" />
function get_html_single_tags(){
    if [[ -z ${1} ]] || [[ -z ${2} ]];
    then
        error "Usage: get_html_single_tags <HTML文件> <标签>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local htm=$1
    local tag=$2
    local regu="<${tag}[^>]* \/>"
    local tags=$(grep -oP "${regu}" ${htm})
    echo ${tags}
    unset htm regu tag tags
}


########################################
#功能: 从HTML提取注释
#参数: $1，HTML文件路径
#返回: 注释
#示例: get_html_annotation "tt.htm" "meta"
########################################
#<!--广告位-->
function get_html_annotation(){
    if [[ -z ${1} ]];
    then
        error "Usage: get_html_annotation <HTML文件>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local htm=$1
    local regu="<!--(.*?)-->"
    local tags=$(cat ${htm} | grep -zoP "${regu}" | tr '\0' '\n')
    echo ${tags}
    unset htm regu tags
}



########################################
#功能: 从HTML中提取所有的URL
#参数: $1，HTML文件路径
#返回: 注释
#示例: get_html_addrs "tt.htm"
########################################
#https://tools.kalvinbg.cn/static/js/ktPublic.js?v=20230226
function get_html_addrs(){
    if [[ -z ${1} ]];
    then
        error "Usage: get_html_addrs <HTML文件>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    
    local htm=$1
    local regu="https?://[^\s'\"]+"
    local tags=$(grep -oP "${regu}" ${htm})
    echo ${tags}
    unset htm regu tags
}


########################################
#功能: 从HTML中提取电子邮箱地址
#参数: $1，HTML文件路径
#返回: 邮箱地址
#示例: get_html_email "tt.htm" "meta"
########################################
#1481397688@qq.com
function get_html_email(){
    if [[ -z ${1} ]];
    then
        error "Usage: get_html_email <HTML文件>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local htm=$1
    local regu='\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*'
    local tags=$(cat ${htm} | grep -oP "${regu}")
    echo ${tags}
    unset htm regu tags
}



########################################
#功能: 从HTML中提取电话号码
#参数: $1，HTML文件路径
#返回: 号码
#示例: get_html_phone "tt.htm"
########################################
#0511-4405222 或 021-87888822
function get_html_phone(){
    if [[ -z ${1} ]];
    then
        error "Usage: get_html_phone <HTML文件>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local htm=$1
    local regu='^\d{3}-\d{8}$|^\d{4}-\d{7}$|^1[3-9]\d{9}$'
    local tags=$(grep -oP "${regu}" ${htm})
    echo ${tags}
    unset htm regu tags
}

########################################
#功能: 从HTML提取5位以上的数字
#参数: $1，HTML文件路径
#返回: 数字
#示例: get_html_number "tt.htm" 
########################################
#20230226 
#10000
#1481397688
function get_html_number(){
    if [[ -z ${1} ]];
    then
        error "Usage: get_html_number <HTML文件>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local htm=$1
    local regu="[1-9][0-9]{4,}"
    local tags=$(grep -oP "${regu}" ${htm})
    echo ${tags}
    unset htm regu tags
}




#-------------------------------
# 文件名: pip.txt
# 文件内容: 
#   <a href="Flask-2.0.2-py3-none-any.whl">Flask-2.0.2-py3-none-any.whl</a>                       10-Oct-2021 08:04               95238
#   <a href="Flask-2.2.2-py3-none-any.whl">Flask-2.2.2-py3-none-any.whl</a>                       10-Apr-2023 00:46              101477
#   …………

# 命令: get_html_file_addr "pip.txt" "whl"
# 返回:
#   Flask-2.0.2-py3-none-any.whl
#   Flask-2.2.2-py3-none-any.whl
#-------------------------------
function get_html_file_addr(){
    #取得src或href后的文件地址
    if [[ -z ${1} ]] || [[ -z ${2} ]];
    then
        error "Usage: get_html_file_addr <HTML文件> <后缀名>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local htm=$1
    local suff=$2
    local regu1="(src|href)=[(\"|\')]{1}[^(\"|\'|\?)]*"
    local regu2="\.${suff}"
    local regu3='s/^(.*)="//g'
    
    local tags=$(cat ${htm} | grep -oP ${regu1} | egrep -i ${regu2} | sed -r ${regu3})
    echo ${tags}
    unset htm regu1 regu2 regu3 suff tags
}
function get_html_href_addr(){
    #取得href后的文件地址
    if [[ -z ${1} ]] || [[ -z ${2} ]];
    then
        error "Usage: get_html_file_addr <HTML文件> <后缀名>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local htm=$1
    local suff=$2
    local regu1="href=[(\"|\')]{1}[^(\"|\'|\?)]*"
    local regu2="\.${suff}"
    local regu3='s/^(.*)="//g'
    
    local tags=$(cat ${htm} | grep -oP ${regu1} | egrep -i ${regu2} | sed -r ${regu3})
    echo ${tags}
    unset htm regu1 regu2 regu3 suff tags
}
function get_html_src_addr(){
    #取得src后的文件地址
    if [[ -z ${1} ]] || [[ -z ${2} ]];
    then
        error "Usage: get_html_src_addr <HTML文件> <后缀名>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local htm=$1
    local suff=$2
    local regu1="src=[(\"|\')]{1}[^(\"|\'|\?)]*"
    local regu2="\.${suff}"
    local regu3='s/^(.*)="//g'
    
    local tags=$(cat ${htm} | grep -oP ${regu1} | egrep -i ${regu2} | sed -r ${regu3})
    echo ${tags}
    unset htm regu1 regu2 regu3 suff tags
}


########################################
#功能: 删除文件中重复的行
#参数: $1，文件路径
#返回: 
#示例: remove_duplicates "file_path" 
########################################
function remove_duplicates() {
    if [[ -z ${1} ]];
    then
        error "Usage: remove_duplicates <文件路径>"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }
    local file_path=$1
    # 使用sort和uniq命令删除重复行，并将结果写回原文件
    sort "$file_path" | uniq > temp.txt && mv temp.txt "$file_path"
    unset file_path
}

########################################
#功能: 替换文件中指定的字符串
#参数: $1，文件路径
#      $2，需要被替换的字符串
#      $3，替换后的字符串
#返回: 无返回值，直接修改原文件
#示例: replace_string "/path/to/file.txt" "old_string" "new_string"
########################################
function replace_string() {
    if [[ -z ${1} ]] || [[ -z ${2} ]];
    then
        error "Usage: replace_string <文件路径> <被替换的字符串> [替换后的字符串]"
        return $INVALID_ARGUMENTS
    fi
    [[ ! -f ${1} ]] && {
        error "无效文件: ${1}"
        return $INVALID_ARGUMENTS
    }

    local file_path="$1"
    local old_string="$2"
    local new_string="$3"

  # 使用sed命令替换文件中的字符串
  sed -i "s/${old_string}/${new_string}/g" "${file_path}"
  unset file_path old_string new_string
}



__web_init__






























